<?php 

require_once '../controller/Conexao.class.php';
require_once '../model/Lancamento.php';

class LancamentoDAO {
	
	private  $conexao;
	
	public function __construct() {
		$this->conexao = Conexao::getConexao();
	}
	
	public function cadastrarLancamento($Lancamento){
		if ($Lancamento->getId() == null){
			$this->conexao->exec(
					"INSERT INTO `conttas`.`lancamento` (`descricao`,`dataCadastro`,`valor`,`tipo`)
					VALUES ('".$Lancamento->getDescricao()."',
							'".$this->formatarDataInsert($Lancamento->getDataCadastro())."',
							'".str_replace(",",".",str_replace(".","",$Lancamento->getValor()))."',
							'".$Lancamento->getTipo()."')");
		}else {
			$this->conexao->exec(
					"UPDATE `conttas`.`lancamento`
					SET `descricao` = '".$Lancamento->getDescricao()."',
					`dataCadastro` = '".$this->formatarDataInsert($Lancamento->getDataCadastro())."',
					`valor` = '".str_replace(",",".",str_replace(".","",$Lancamento->getValor()))."',
					`tipo` = '".$Lancamento->getTipo()."'
					WHERE `idLancamento` = '".$Lancamento->getId()."'");
		}
	}
	
	public function pesquisarPorDescricao($descricao) {
		$Lancamentos = array();
		foreach ($this->conexao->query(
				"SELECT * FROM `conttas`.`lancamento`
				WHERE `descricao` LIKE '%$descricao%'") as $linha) {
				$Lancamento = new Lancamento(
						$linha['descricao'], 
						$this->formatarDataSelect($linha['dataCadastro']), 
						number_format($linha['valor'], 2, ',', '.'), 
						$linha['tipo']);
				$Lancamento->setId($linha['idLancamento']);
				$Lancamentos[] = $Lancamento;
		}
		return $Lancamentos;
	}
	
	public function pesquisarPorDataCadastro($dataDe, $dataAte) {
		$Lancamentos = array();
		$consulta = "SELECT * FROM `conttas`.`lancamento`
				WHERE `dataCadastro` BETWEEN  '".$this->formatarDataInsert($dataDe)."' AND '".$this->formatarDataInsert($dataAte)."'";
		
		foreach ($this->conexao->query($consulta) as $linha) {
				$Lancamento = new Lancamento(
						$linha['descricao'], 
						$this->formatarDataSelect($linha['dataCadastro']), 
						number_format($linha['valor'], 2, ',', '.'), 
						$linha['tipo']);
				$Lancamento->setId($linha['idLancamento']);
				$Lancamentos[] = $Lancamento;
		}
		return $Lancamentos;
	}
	
	
	
	public function pesquisarPorTipo($tipo) {
		$Lancamentos = array();
		foreach ($this->conexao->query(
				"SELECT * FROM `conttas`.`lancamento`
				WHERE `tipo` = '$tipo'") as $linha) {
				$Lancamento = new Lancamento(
						$linha['descricao'], 
						$this->formatarDataSelect($linha['dataCadastro']), 
						number_format($linha['valor'], 2, ',', '.'), 
						$linha['tipo']);
				$Lancamento->setId($linha['idLancamento']);
				$Lancamentos[] = $Lancamento;
		}
		return $Lancamentos;
	}
	
	public function pesquisarPorId($id) {
		foreach ($this->conexao->query(
				"SELECT * FROM `conttas`.`lancamento`".
				"WHERE `idLancamento` = $id") as $linha) {
					$Lancamento = new Lancamento(
							$linha['descricao'], 
							$this->formatarDataSelect($linha['dataCadastro']), 
							number_format($linha['valor'], 2, ',', '.'), 
							$linha['tipo']);
					$Lancamento->setId($id);
		}
		return $Lancamento;
	}
	
	public function obterTodos($limit) {
		$Lancamentos = array();
		foreach ($this->conexao->query(
				"SELECT * FROM `conttas`.`lancamento` ORDER BY tipo DESC, dataCadastro DESC LIMIT $limit") as $linha) {
				$Lancamento = new Lancamento(
						$linha['descricao'], 
						$this->formatarDataSelect($linha['dataCadastro']), 
						number_format($linha['valor'], 2, ',', '.'), 
						$linha['tipo']);
				
				$Lancamento->setId($linha['idLancamento']);
				$Lancamento->setPago($linha['pago']);
				$Lancamentos[] = $Lancamento;
		}
		return $Lancamentos;
	}
	
	public function contarDespesas() {
		
		$consulta = "SELECT * FROM `conttas`.`lancamento` where tipo = 'Despesa'";
		$totalDespesa= $this->conexao->query($consulta)->rowCount();
		
		return $totalDespesa;
		
		
	}
	
	public function contarReceitas() {
	
		$consulta = "SELECT * FROM `conttas`.`lancamento` where tipo = 'Receita'";
		$totalReceita= $this->conexao->query($consulta)->rowCount();
	
		return $totalReceita;
	
	
	}
	
	
	public function obterTotalRegistrosLancamento() {
		
		$consulta = "SELECT * FROM `conttas`.`lancamento` ORDER BY tipo DESC, dataCadastro DESC";
		$totalLancamentos= $this->conexao->query($consulta)->rowCount();
		
		return $totalLancamentos;
	}
	
	public function excluir($id) {
		$this->conexao->exec("DELETE FROM `conttas`.`lancamento` WHERE `idLancamento` = $id");
	}
	
	public function obterSomaDespesas() {
		foreach ($this->conexao->query(
				"SELECT SUM(valor) FROM conttas.lancamento WHERE tipo = 'Despesa' and pago = 0") as $linha)
			return number_format($linha["SUM(valor)"], 2, ',', '.');
		return number_format(0, 2, ',', '.');
	}
	
	public function obterSomaReceitas() {
		foreach ($this->conexao->query(
				"SELECT SUM(valor) FROM conttas.lancamento WHERE tipo = 'Receita' and pago = 0") as $linha)
			return number_format($linha["SUM(valor)"], 2, ',', '.');
		return number_format(0, 2, ',', '.');
		
	}
	
	public function obterDespesasPagas() {
		foreach ($this->conexao->query(
				"SELECT SUM(valor) FROM conttas.lancamento WHERE tipo = 'Despesa' and pago = 1") as $linha)
			return number_format($linha["SUM(valor)"], 2, ',', '.');
		return number_format(0, 2, ',', '.');
	}
	
	public function obterReceitasRecebidas() {
		foreach ($this->conexao->query(
				"SELECT SUM(valor) FROM conttas.lancamento WHERE tipo = 'Receita' and pago = 1") as $linha)
			return number_format($linha["SUM(valor)"], 2, ',', '.');
		return number_format(0, 2, ',', '.');
	}
	function formatarDataInsert($data)
	{
		//if($this->validaData($data)) {
			return implode(!strstr($data, '/') ? "/" : "-", array_reverse(explode(!strstr($data, '/') ? "-" : "/", $data)));
		//}
	}
	
	public function formatarDataSelect($data){
		try {
			$data = new DateTime($data);
			return $data->format('d/m/Y');
		} catch (Exception $e) {
			echo $e;
		}
	}
	
	function validaData($data)
	{
		$data = split("[-,/]", $data);
		if(!checkdate($data[1], $data[0], $data[2]) and !checkdate($data[1], $data[2], $data[0])) {
			return false;
		}
		return true;
	}
	
	public function trocarStatus($id,$pago) {
		$this->conexao->exec("UPDATE lancamento SET pago = $pago WHERE idLancamento = $id");
	}
}
?>